// license-header java merge-point
/**
 * This is only generated once! It will never be overwritten. You can (and have to!) safely modify it by hand.
 */
package org.tinaelle.server.service;

import java.util.Collection;
import java.util.Iterator;

import org.tinaelle.ServiceLocator;
import org.tinaelle.common.dto.AdParameterDTO;
import org.tinaelle.common.dto.AdParameterValueDTO;
import org.tinaelle.server.domain.AdParameter;
import org.tinaelle.server.domain.AdParameterDao;
import org.tinaelle.server.domain.AdParameterValue;
import org.tinaelle.utils.BootstrapUtils;

/**
 * @see org.tinaelle.service.AdParameterService
 */
public class AdParameterServiceImpl extends org.tinaelle.server.service.AdParameterServiceBase {

	/**
     * 
     */
	private static final long	serialVersionUID	= 1L;

	/**
	 * @see org.tinaelle.service.AdParameterService#getParameterByInternalName(java.lang.String)
	 */
	@Override
	protected org.tinaelle.common.dto.AdParameterDTO handleGetParameterByInternalName(
	        final java.lang.String internalName) throws java.lang.Exception {
		return ( AdParameterDTO ) getAdParameterDao().findByInternalName( AdParameterDao.TRANSFORM_ADPARAMETERDTO,
		        internalName );
	}

	@Override
	protected AdParameterValueDTO handleGetParameterValueByName(final String internalName, final String name)
	        throws Exception {
		final AdParameter param = ( AdParameter ) getAdParameterDao().findByInternalName(
		        AdParameterDao.TRANSFORM_NONE, internalName );
		if ( param == null ) {
			return null;
		}

		final Collection<AdParameterValue> values = param.getValues();
		for ( final Iterator<AdParameterValue> i = values.iterator(); i.hasNext(); ) {
			final AdParameterValue value = i.next();
			if ( value.getName().equalsIgnoreCase( name ) ) {
				return getAdParameterValueDao().toAdParameterValueDTO( value );
			}
		}
		return null;
	}

	/**
	 * @see org.tinaelle.service.AdParameterService#getParameterValuesById(int)
	 */
	@Override
	protected org.tinaelle.common.dto.AdParameterValueDTO[] handleGetParameterValuesById(final Integer adParameterId)
	        throws java.lang.Exception {
		final AdParameter adParameter = getAdParameterDao().load( adParameterId );
		final Collection<AdParameterValue> adParameterValues = adParameter.getValues();

		getAdParameterValueDao().toAdParameterValueDTOCollection( adParameterValues );

		return adParameterValues.toArray( new AdParameterValueDTO[ 0 ] );

	}

	@Override
	protected void handleFillInitialValues() throws Exception {
		/**
		 * Load Parameter
		 */
		fillInitialValuesForParameter();

		/**
		 * Load Parameter Values
		 */
		fillInitialValuesForParameterValue();
	}

	@Override
	protected void handleFillInitialValuesForParameter() throws Exception {
		final ServiceLocator serviceLocator = ServiceLocator.instance();
		final AdSystemService adSystemSrv = serviceLocator.getAdSystemService();

		// File Format :
		// Name, Internal Name, Description, : 0, 1, 2
		// Is System, Entity Type : 3, 4
		String[][] parameterContent = BootstrapUtils.instance().getBootstrapSheetContent( "AdParameter" );
		for ( int i = 1; i < parameterContent.length; i++ ) {
			final String[] parameterLine = parameterContent[ i ];

			if ( parameterLine.length == 5 ) {
				AdParameterDTO adParameterDTO = getParameterByInternalName( parameterLine[ 1 ].trim() );
				if ( adParameterDTO == null ) {
					adParameterDTO = new AdParameterDTO();
				}
				adParameterDTO.setName( parameterLine[ 0 ].trim() );
				adParameterDTO.setInternalName( parameterLine[ 1 ].trim() );
				adParameterDTO.setDescription( parameterLine[ 2 ].trim() );
				adParameterDTO.setIsSystem( parameterLine[ 3 ].trim().equalsIgnoreCase( "TRUE" )
				        || parameterLine[ 3 ].trim().equalsIgnoreCase( "Y" )
				        || parameterLine[ 3 ].trim().equalsIgnoreCase( "1" ) );
				adParameterDTO.setAdEntityTypeId( adSystemSrv.getEntityTypeByName( parameterLine[ 4 ].trim() )
				        .getAdEntityTypeId() );

				adParameterDTO = save( adParameterDTO );
			}
		}
	}

	@Override
	protected void handleFillInitialValuesForParameterValue() throws Exception {
		final ServiceLocator serviceLocator = ServiceLocator.instance();
		final AdSystemService adSystemSrv = serviceLocator.getAdSystemService();

		// File Format :
		// Parameter Internal Name, Name, Value, : 0, 1, 2
		// Description, Entity Type : 3, 4
		String[][] parameterValueContent = BootstrapUtils.instance().getBootstrapSheetContent( "AdParameterValue" );
		for ( int i = 1; i < parameterValueContent.length; i++ ) {
			final String[] parameterValueLine = parameterValueContent[ i ];

			if ( parameterValueLine.length == 5 ) {
				AdParameterValueDTO adParameterValueDTO = getParameterValueByName( parameterValueLine[ 0 ].trim(),
				        parameterValueLine[ 1 ].trim() );
				AdParameterDTO adParameterDTO = getParameterByInternalName( parameterValueLine[ 0 ].trim() );
				if ( adParameterValueDTO == null ) {
					adParameterValueDTO = new AdParameterValueDTO();
				}
				adParameterValueDTO.setName( parameterValueLine[ 0 ].trim() );
				adParameterValueDTO.setValue( parameterValueLine[ 2 ].trim() );
				adParameterValueDTO.setDescription( parameterValueLine[ 3 ].trim() );
				adParameterValueDTO.setAdEntityTypeId( adSystemSrv.getEntityTypeByName( parameterValueLine[ 4 ].trim() )
				        .getAdEntityTypeId() );
				adParameterValueDTO.setAdParameterId( adParameterDTO.getAdParameterId() );
				adParameterValueDTO = save( adParameterValueDTO );
			}
		}
	}
}